package com.gaojinqi.sys.core.shiro.rule;

import com.gaojinqi.base.common.util.StringUtil;
import com.gaojinqi.sys.core.shiro.filter.JwtFilter;
import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.Set;

/**
 * shiro 动态 url 规则
 *
 * @author gaojinqi
 * @version 1.0
 * @since 2020年05月12日
 */
@Data
public class RolePermRule implements Serializable {

    public static final String SPLITTER = "==";
    private static final String ANON_ROLE = "role_anon";

    private static final long serialVersionUID = 2458679248372926821L;

    /**
     * 资源URL
     */
    private String url;
    /**
     * 访问资源所需要的角色列表，多个列表用逗号间隔
     */
    private Set<String> needRoles;

    /**
     * @return 角色1, 角色2, 角色n
     */
    public String getRolesStr() {
        return StringUtil.joinSplitter(this.getNeedRoles(), ",");
    }

    /**
     * description 将url needRoles 转化成shiro可识别的过滤器链：url=jwt[角色1、角色2、角色n]
     */
    public StringBuilder toFilterChain() {

        if (null == this.url || this.url.isEmpty()) {
            return null;
        }
        StringBuilder stringBuilder = new StringBuilder();
        Set<String> roleSet = getNeedRoles();

        if (!CollectionUtils.isEmpty(roleSet)) {
            if (roleSet.contains(ANON_ROLE)) {
                // 约定若role_anon角色拥有此uri资源的权限,则此uri资源直接访问不需要认证和权限
                stringBuilder.append("anon");
            } else {
                //  其他自定义资源uri需通过jwt认证和角色认证
                stringBuilder.append(JwtFilter.FILTER_NAME + "[" + this.getRolesStr() + "]");
            }
        }
        return stringBuilder.length() > 0 ? stringBuilder : null;
    }

    @Override
    public String toString() {
        return "RolePermRule [url=" + url + ", needRoles='" + needRoles + "']";
    }

}
